package com.eshop.serializer;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;

import java.io.IOException;
import java.math.BigDecimal;
import java.text.DecimalFormat;

/**
 * 自定义的JSON序列化器——BigDecimalSerializer，它继承自Jackson库中的JsonSerializer<BigDecimal>。当系统尝试将BigDecimal类型的对象转换成JSON字符串时，会调用这个序列化器来进行序列化操作。
 *
 * serialize方法是序列化的核心逻辑实现：
 *
 * 首先检查传入的BigDecimal值是否非空且不为空字符串。这里的""判断可能是个误解，因为BigDecimal类型本身不可能是空字符串，可能是作者为了兼容其他可能的数据类型或者确保null安全。
 *
 * 如果BigDecimal值非空，创建一个DecimalFormat对象，设置格式为"0.00"，意味着输出两位小数。然后使用这个格式器将BigDecimal对象格式化为字符串，并通过gen.writeString()方法写入到JSON流中。
 *
 * 如果BigDecimal值为空或null，则直接调用gen.writeString(value + "")将其转换为字符串形式（对于null值，此操作将会得到"null"字符串）并写入JSON流。
 *
 * 总之，这个BigDecimalSerializer的作用就是确保所有的BigDecimal数值在序列化为JSON字符串时都按照"0.00"的格式（保留两位小数）进行输出。
 */
public class BigDecimalSerializer extends JsonSerializer<BigDecimal>
{
    public void serialize(final BigDecimal value, final JsonGenerator gen, final SerializerProvider serializerProvider) throws IOException {
        if (value != null && !"".equals(value)) {
            // 不管怎么样，设置了格式只保留两位小数
            final DecimalFormat df2 = new DecimalFormat("0.00");
            gen.writeString(df2.format(value));
        }
        else {
            gen.writeString(value + "");
        }
    }
}
